package org.atlantis.grosbeak.cable;

import java.util.Arrays;

import javax.servlet.http.HttpServletRequest;

import org.atlantis.grosbeak.lang.Strings;

/**
 * 对HttpServletRequest对象进行解析。
 * 
 * @author <a href="mailto:seenoevil.cn@gmail.com">SeeNoEvil</a>
 * 
 */
class RequestUrlKit {

	/**
	 * 实例化一个RequestUrlAnalyzer对象。RequestUrlAnalyzer非单态，所以每次调用这个方法均会生成一个新对象。
	 * 
	 * @param url
	 *            需要分析的URL字符串。
	 * @return 全新的RequestUrlAnalyzer对象。
	 */
	public static RequestUrlKit instance(HttpServletRequest request) {
		return new RequestUrlKit(request);
	}

	// 项目的名称。如：http://localhost:8080/grosbeak_test/blog，得到的就是/grosbeak_test
	private String domainUrl;
	// 请求路径。如：http://localhost:8080/grosbeak_test/blog，得到的就是/grosbeak_test/blog
	private String requestUrl;
	private String domain = "";
	private String action = "main";
	private String method = "index";
	private String[] params = new String[0];

	private RequestUrlKit(HttpServletRequest request) {
		domainUrl = request.getContextPath();
		requestUrl = request.getRequestURI();

		if (!Strings.isEmpty(domainUrl))
			domain = Strings.removeFirst(domainUrl);

		// am是Action和Method合并在一起的字符串，字符切割开来，如blog/edit
		String am = "";
		if (!Strings.isEmpty(requestUrl) && !Strings.isEmpty(domainUrl)) {
			am = Strings.removeFirst(requestUrl, 1 + domainUrl.length());
		} else if (!Strings.isEmpty(requestUrl) && Strings.isEmpty(domainUrl)) {
			am = Strings.removeFirst(requestUrl);
		}

		String[] _temp = Strings.spliteIgnoreBlank(am, "/+");
		if (_temp.length > 2) {
			action = _temp[0];
			method = _temp[1];
			params = Arrays.copyOfRange(_temp, 2, _temp.length);
		} else if (_temp.length > 1) {
			action = _temp[0];
			method = _temp[1];
		} else if (_temp.length > 0) {
			action = _temp[0];
		}
	}

	/**
	 * 获得请求URL中对应项目名称的部分。如：
	 * 
	 * <pre>
	 * 请求URL是：http://localhost:8080/grosbeak_sample/blog
	 * 那么获得的对应Action的部分就是“grosbeak_sample”。
	 * </pre>
	 * 
	 * @return URL中对应项目名称的部分的字符串。当不能获取的是否，返回""。
	 */
	public String getDomain() {
		return domain;
	}

	/**
	 * 获得请求URL中对应Action的部分。如：
	 * 
	 * <pre>
	 * 请求URL是：http://localhost:8080/grosbeak_sample/blog
	 * 那么获得的对应Action的部分就是“blog”。
	 * 请求URL是：http://localhsot:8080/grosbeak_sample/blog/edit
	 * 那么获得的对应Action的部分就是“blog”。
	 * </pre>
	 * 
	 * @return URL中对应Action的部分的字符串。当不能获取的时候，返回""。
	 */
	public String getActionBeanUrl() {
		return action;
	}

	/**
	 * 获取请求URL中对应Action部分的方法部分。如：
	 * 
	 * <pre>
	 * 请求URL是：http://localhost:8080/grosbeak_sample/blog/edit
	 * 那么获得的对应Action部分的方法部分就是“edit”。
	 * </pre>
	 * 
	 * @return URL中对应Action的部分的方法部分的字符串。当不能获取的时候，返回“index”。
	 */
	public String getActionMethodUrl() {
		return method;
	}

	/**
	 * 获取请求URL中对应传递来参数的部分。
	 * 
	 * @return 包含所有参数的数组，如果没有参数，那么返回null。
	 */
	public String[] getParams() {
		return params;
	}
	
	/**
	 * 得到用户提交的完整的URL。
	 * @return 用户提交的完成的URL.
	 */
	public String getFullUrl() {
		return requestUrl;
	}
}
